﻿Imports Commander_Wars.Spieletools
''' <summary>
''' Eine einfache KI mit verbesserten Funktionen.
''' Sie kann Gebaeude und Transporter benutzen.
''' Sie greift aber keine Spezialgebaeude an.
''' </summary>
''' <remarks></remarks>
Public Class KIEinfach
    Inherits ObjektKI
    Const AllesBauSumme As Integer = 20000
    Const BilligsterPanzer As Integer = 6000
    Const TeuersterPanzer As Integer = 11000
    Dim Infis As Integer
    Dim TTPs As Integer
    Dim LBoote As Integer
    Dim THelis As Integer
    Dim Spaeher As Integer
    Public Sub New(ByVal neuSpieler As ObjektSpieler)
        MyBase.New(neuSpieler, 1, 1, 0.5#, Besetzungsprioritaeten.Keine, GeldTPAngriffsModus.NurGeld, 0, 0, 0, -1)
    End Sub
    ''' <summary>
    ''' Fuehrt die Zug bewegungen der Kinderleichten KI aus. Muahaha und dann Boom.Diese KI kann keine Gebaeude bedinnen
    ''' </summary>
    ''' <remarks></remarks>
    Public Overrides Sub KISchleife()
        Objektverwalter.Spielfeld.EingabenErlauben = False
        Schleife = False
        KIModusIntern = KIModiIntern.KIStart
        KIWarten(12)
        While Schleife = False
            MomentaneEinheit = 0
            Select Case KIModusIntern
                Case KIModiIntern.KIStart
                    GabenEinsetzen()
                Case KIModiIntern.StartWarten
                    KIModusIntern = KIModiIntern.GebaeudeAngriff
                Case KIModiIntern.GebaeudeAngriff
                    GebaeudeFeuer()
                Case KIModiIntern.ExternGesteuerteEinheiten
                    ExternGesteurteEinheiten()
                Case KIModiIntern.Besetzen
                    Besetzen()
                Case KIModiIntern.HoelliumZiehen
                    HoelliumZiehen()
                Case KIModiIntern.Fernkampf
                    FernkampfAngriff()
                Case KIModiIntern.Nahkampf
                    NahkampfAngriff()
                Case KIModiIntern.Nahkampfziehen
                    NahkampfZiehen()
                Case KIModiIntern.Infanterieziehen
                    InfanterieZiehen() 'UV
                Case KIModiIntern.Fernkampfziehen
                    Fernkampfziehen()
                Case KIModiIntern.TransporterVerladen
                    EinheitenVerladen()
                    KIModusIntern = KIModiIntern.Transproterziehen
                Case KIModiIntern.Transproterziehen
                    TransporterZiehen(EinheitenSortierKriterien.Zufall)
                    KIModusIntern = KIModiIntern.Bauen
                Case KIModiIntern.Bauen
                    TruppenWegZiehen()
                    GetAllBuildings()
                    Bauen() 'UV
                Case KIModiIntern.RundenEnde
                    RundenEnde()
            End Select
        End While
    End Sub
    ''' <summary>
    ''' So werden zu beginn Gaben einer einfachen KI eingesetzt.
    ''' Es wird nicht ueberprueft ob der Einsatz der Gabe bzw. Spezialgabe sinnvoll ist.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub GabenEinsetzen()
        If Spieler.VeraenderteWerte.Gabeeinsatz = True Then
            Dim GabefuellstandKO1 As Integer = Spieler.KOS(0).Gabeleiste
            Dim GabefuellstandKO2 As Integer = -1
            If IsNothing(Spieler.KOS(1)) = False Then
                GabefuellstandKO2 = Spieler.KOS(1).Gabeleiste
            End If
            If GabefuellstandKO1 > Spieler.KOS(0).Gabekosten * Spieler.KOS(0).Sternkosten + Spieler.KOS(0).Sternkosten / 2 Then
                If GabefuellstandKO1 >= (Spieler.KOS(0).Gabekosten + Spieler.KOS(0).SpezialgabeKosten) * Spieler.KOS(0).Sternkosten Then
                    If IsNothing(Spieler.KOS(1)) = False And Objektverwalter.Spielfeld.Regeln.DoppelGabe Then
                        If GabefuellstandKO2 >= (Spieler.KOS(1).SpezialgabeKosten + Spieler.KOS(1).Gabekosten) * Spieler.KOS(1).Sternkosten Then
                            'Die Doppelgabe kommt euer untergang ist nah Muahaha
                            Spieler.KOS(0).Doppelgabe()
                        ElseIf GabefuellstandKO2 <= (Spieler.KOS(1).SpezialgabeKosten + Spieler.KOS(1).Gabekosten) * Spieler.KOS(1).Sternkosten - Spieler.KOS(1).Sternkosten * 3 Then
                            'Die KI setzt die Spezialgabe ein
                            If Spieler.KOS(0).KannSpezialGabe Then
                                Spieler.KOS(0).Spezialgabe()
                            End If
                        End If
                    Else
                        'Die KI setzt die Spezialgabe ein
                        If Spieler.KOS(0).KannSpezialGabe Then
                            Spieler.KOS(0).Spezialgabe()
                        End If
                    End If
                End If
            ElseIf GabefuellstandKO1 > Spieler.KOS(0).Gabekosten * Spieler.KOS(0).Sternkosten Then
                'Die KI setzt die Gabe ein
                If Spieler.KOS(0).UseCOP Then
                    If Spieler.KOS(0).KannGabe Then
                        Spieler.KOS(0).Gabe()
                    End If
                End If
                End If
        End If
        KIModusIntern = KIModiIntern.StartWarten
        KIWarten(8)
    End Sub
    ''' <summary>
    ''' Laesst die Gebaeude feuern
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub GebaeudeFeuer()
        Dim NewUnits As Boolean = False
        While MomentaneEinheit < Gebaeude.Length
            Dim MomGebaeude As ObjektGebaeude = Gebaeude(MomentaneEinheit)
            If Not MomGebaeude.GetRealGebaeudeID = "VERWEIS" Then
                If MomGebaeude.Feuerbereit = 0 Then
                    If TypeOf MomGebaeude Is GebaeudeLaser Then
                        GebaeudeAuswaehlen(KIModiExtern.Schuss, MomGebaeude, New EinheitAmphibienpanzer(0, 1, 1, False), 4)
                    ElseIf TypeOf MomGebaeude Is GebaeudeAruura Then
                        GebaeudeAuswaehlen(KIModiExtern.Schuss, MomGebaeude, New EinheitAmphibienpanzer(0, 1, 1, False), 4)
                    ElseIf TypeOf MomGebaeude Is GebaeudeOmega_Rakete Then
                        Dim Omega As GebaeudeOmega_Rakete = MomGebaeude
                        If Omega.RaketeFeuerbereit = True Then
                            Dim Ziel As Point = GetBestenEinschlagsOrt(Omega.Reichweite, Omega.Schaden)
                            If Ziel.X >= 0 Then
                                GebaeudeAuswaehlen(KIModiExtern.OmegaRaketeStarten, Omega, New EinheitArtillerie(0, Ziel.X, Ziel.Y), 4)
                            End If
                        ElseIf Spieler.Fonds > 30000 Then
                            For I = 0 To Omega.Variablen.Length - 1
                                If Omega.Variablen(I).Wert = 1 Then
                                    'Wir bauen einen Teil der Omega-Rakete
                                    GebaeudeAuswaehlen(KIModiExtern.OmegaUpgradeKaufen, Omega, New EinheitArtillerie(0, I, 0), 4)
                                    Exit For
                                End If
                            Next
                        End If
                    Else
                        Dim Ziel As Point = GetBestesGebaeudeFeuer(MomGebaeude)
                        If Ziel.X >= 0 And Ziel.Y >= 0 Then
                            If MomGebaeude.Angriff = ObjektGebaeude.Angriffe.SchussN Or MomGebaeude.Angriff = ObjektGebaeude.Angriffe.SchussW Or MomGebaeude.Angriff = ObjektGebaeude.Angriffe.SchussS Or MomGebaeude.Angriff = ObjektGebaeude.Angriffe.SchussO Then
                                GebaeudeAuswaehlen(KIModiExtern.Schuss, MomGebaeude, Objektverwalter.Spielfeld.Einheiten(Ziel.X, Ziel.Y, Schlachtfeld), 4)
                            Else
                                'Wir muessen erst noch eine virtuelle Einheit erschaffen.=)
                                GebaeudeAuswaehlen(KIModiExtern.Schuss, MomGebaeude, New EinheitAmphibienpanzer(0, Ziel.X, Ziel.Y, False), 4)
                            End If
                        End If
                    End If
                ElseIf MomGebaeude.GebaeudeID = "FABRIK" Then
                    Dim BauEinheiten As String() = BestesGeldAusgebenBeiFabrik(MomGebaeude)
                    Dim Y As Integer = MomGebaeude.Rechteck.Y + 2
                    Dim X As Integer = MomGebaeude.Rechteck.X - 1
                    For I = 0 To BauEinheiten.Length - 1
                        If Not BauEinheiten(I) = "" Then
                            GebaeudeAuswaehlen(KIModiExtern.FabrikBauen, MomGebaeude, ObjektLadeklasse.NewEinheit(BauEinheiten(I), Spieler.Spieler, X, Y), 4)
                            NewUnits = True
                        End If
                        X += 1
                    Next
                End If
            End If
            MomentaneEinheit += 1
        End While
        If NewUnits Or Einheiten.Length = 0 Then
            GetAllUnits(EinheitenSortierKriterien.Zufall)
        End If
        KIModusIntern = KIModiIntern.ExternGesteuerteEinheiten
    End Sub
    ''' <summary>
    ''' Mit dieser Funktion Suchen sich die Einfachen KI's die Gebaeude aus die sie besetzen
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Besetzen()
        KOEinheitErschaffen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                Dim Einheit As Integer = MomentaneEinheit
                If Einheiten(Einheit).KannBesetzen = True Then
                    If Einheiten(MomentaneEinheit).IsUsingUnit(MinimalerTreibstoff, MinimaleMunition, MinimaleKP) = True Then
                        Dim WSS As Wegsuchsystem = CreateWSS(Einheiten(Einheit))
                        If Einheiten(Einheit).Besetzen = True Then
                            'Diese Einheit besetzt gerade ein Gebaeude da macht sie damit gleich weiter
                            Einheitauswaehlen(Einheiten(Einheit), New Point(Einheiten(Einheit).X, Einheiten(Einheit).Y), KIModiExtern.Besetzen, Nothing, WSS, 4)
                        ElseIf Einheiten(Einheit).KannBesetzen = True Then
                            Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(Einheiten(Einheit).X, Einheiten(Einheit).Y, Schlachtfeld).Gebaeude
                            If G Is Nothing Then
                                Dim Ziel As Point = GetWeitestesBesetzungsFeld(Einheiten(Einheit), WSS)
                                If Ziel.X >= 0 Then
                                    'Diese KI sucht noch nicht nach dem Besten Gebaeude sondern besetzt das erst beste
                                    WSS.Ziel(Ziel.X, Ziel.Y, True)
                                    Dim Bes As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(Ziel.X, Ziel.Y, Schlachtfeld).Gebaeude
                                    If Bes.Angriff = ObjektGebaeude.Angriffe.Silo Then
                                        Dim Ziel2 As Point = GetBestenEinschlagsOrt(Bes.Reichweite, Bes.Schaden)
                                        Einheitauswaehlen(Einheiten(Einheit), Ziel, KIModiExtern.SiloZuenden, New EinheitAmphibienpanzer(0, Ziel2.X, Ziel2.Y), WSS, 4)
                                    Else
                                        Einheitauswaehlen(Einheiten(Einheit), Ziel, KIModiExtern.Besetzen, Nothing, WSS, 4)
                                    End If
                                End If
                            ElseIf G.IsBesetzung(Spieler.Spieler) = True Then
                                Dim Ziel As New Point(Einheiten(Einheit).X, Einheiten(Einheit).Y)
                                If G.Angriff = ObjektGebaeude.Angriffe.Silo Then
                                    Dim Ziel2 As Point = GetBestenEinschlagsOrt(G.Reichweite, G.Schaden)
                                    Einheitauswaehlen(Einheiten(Einheit), Ziel, KIModiExtern.SiloZuenden, New EinheitAmphibienpanzer(0, Ziel2.X, Ziel2.Y), WSS, 4)
                                Else
                                    Einheitauswaehlen(Einheiten(Einheit), Ziel, KIModiExtern.Besetzen, Nothing, WSS, 4)
                                End If
                            Else
                                Dim Ziel As Point = GetWeitestesBesetzungsFeld(Einheiten(Einheit), WSS)
                                If Ziel.X >= 0 Then
                                    'Diese KI sucht noch nicht nach dem Besten Gebaeude sondern besetzt das erst beste
                                    WSS.Ziel(Ziel.X, Ziel.Y, True)
                                    Dim Bes As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(Ziel.X, Ziel.Y, Schlachtfeld).Gebaeude
                                    If Bes.Angriff = ObjektGebaeude.Angriffe.Silo Then
                                        Dim Ziel2 As Point = GetBestenEinschlagsOrt(Bes.Reichweite, Bes.Schaden)
                                        Einheitauswaehlen(Einheiten(Einheit), Ziel, KIModiExtern.SiloZuenden, New EinheitAmphibienpanzer(0, Ziel2.X, Ziel2.Y), WSS, 4)
                                    Else
                                        Einheitauswaehlen(Einheiten(Einheit), Ziel, KIModiExtern.Besetzen, Nothing, WSS, 4)
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.HoelliumZiehen
    End Sub
    ''' <summary>
    ''' Zieht die Hoelliums des Spielers
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub HoelliumZiehen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).HatsichBewegt = False Then
                    If Einheiten(MomentaneEinheit).EinheitenID = MovementSorts.HOELLIUM.tostring.toupper Then
                        'Wir haben ein Hoellium zum ziehen.=)
                        Dim Hoellium As ObjektEinheit = Einheiten(MomentaneEinheit)
                        Dim WSS As New Wegsuchsystem(Hoellium, Hoellium.X, Hoellium.Y, Hoellium.GetMap, -1)
                        Dim Ziel As Point = GetNaehestesHoelliumZiel(Hoellium, WSS)
                        If Ziel.X >= 0 Then
                            Einheitauswaehlen(Hoellium, Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Fernkampf
    End Sub
    ''' <summary>
    ''' Fuehrt die Fernkaempfe der einfachen KI aus.
    ''' Diese KI haut mit ihren Fernwaffen in keinem Fall ab.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub FernkampfAngriff()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                Dim E As ObjektEinheit = Einheiten(MomentaneEinheit)
                If E.HatsichBewegt = False Then
                    If E.MaximaleReichweite > 1 Then
                        Dim WSS As Wegsuchsystem = CreateWSS(E)
                        'OH je  das wird noch komplikate
                        If E.CanIndirectMoveAndFire = True And Spieler.KOS(0).FireandMove = True Then
                            Dim Feld As Point = GetBestesFernkampfOpfer(E)
                            If Feld.X >= 0 Then
                                Einheitauswaehlen(E, New Point(E.X, E.Y), KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Feld.X, Feld.Y, Schlachtfeld), WSS)
                                Dim Felder As Point2 = GetBestesFernkampfFeldmitBewegung(E, WSS)
                                If Felder.Point1.X >= 0 And Felder.Point2.X >= 0 Then
                                    'So wir haben ein Opfer.
                                    NaechsterBefehl(Felder.Point1, Objektverwalter.Spielfeld.Einheiten(Felder.Point2.X, Felder.Point2.Y, Schlachtfeld), KIModiExtern.Angriff, WSS, 4)
                                End If
                            Else
                                Dim Felder As Point2 = GetBestesFernkampfFeldmitBewegung(E, WSS)
                                If Felder.Point1.X >= 0 And Felder.Point2.X >= 0 Then
                                    'So wir haben ein Opfer.
                                    Einheitauswaehlen(E, Felder.Point1, KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Felder.Point2.X, Felder.Point2.Y, Schlachtfeld), WSS)
                                End If
                            End If
                            EinheitAbwaehlen()
                        ElseIf E.CanIndirectMoveAndFire Then
                            'Ein Angriff ziehen und Feuern wie beim Nahkampf
                            Dim Felder As Point2 = GetBestesFernkampfFeldmitBewegung(E, WSS)
                            If Felder.Point1.X >= 0 And Felder.Point2.X >= 0 Then
                                'So wir haben ein Opfer.
                                Einheitauswaehlen(E, Felder.Point1, KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Felder.Point2.X, Felder.Point2.Y, Schlachtfeld), WSS)
                            End If
                        ElseIf Spieler.KOS(0).FireandMove = True Then
                            'Wir suchen uns ein Opfer
                            Dim Feld As Point = GetBestesFernkampfOpfer(E)
                            If Feld.X >= 0 Then
                                Einheitauswaehlen(E, New Point(E.X, E.Y), KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Feld.X, Feld.Y, Schlachtfeld), WSS)
                            End If
                            'wir haben unser Opfer angegriffen jetzt sollten wir die Einheit noch ziehen.
                            WSS = New Wegsuchsystem(E, E.X, E.Y, Einheiten(MomentaneEinheit).GetMap, -1)
                            Dim Ziel As Point = GetNaehestesFernkampffeld(E, WSS)
                            If Ziel.X >= 0 Then
                                If Objektverwalter.Spielfeld.AktuelleEinheit Is Nothing Then
                                    Einheitauswaehlen(E, New Point(E.X, E.Y), KIModiExtern.Warten, Nothing, WSS)
                                Else
                                    NaechsterBefehl(Ziel, Nothing, KIModiExtern.Warten, WSS, 4)
                                End If
                            Else
                                EinheitAbwaehlen()
                            End If
                        Else
                            'Das ist mir die liebste und einfachst Situation Uff.
                            Dim Feld As Point = GetBestesFernkampfOpfer(E)
                            If Feld.X >= 0 Then
                                Einheitauswaehlen(E, New Point(E.X, E.Y), KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Feld.X, Feld.Y, Schlachtfeld), WSS, 4)
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Nahkampf
    End Sub
    ''' <summary>
    ''' So ziehen einfache KI's in den Nahkampf
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub NahkampfAngriff()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).HatsichBewegt = False Then
                    If Einheiten(MomentaneEinheit).KannBesetzen = False Then
                        If Einheiten(MomentaneEinheit).MinimaleReichweite = 1 Or Not Einheiten(MomentaneEinheit).Waffe1 = "Keine" Then
                            Dim WSS As Wegsuchsystem = CreateWSS(Einheiten(MomentaneEinheit))
                            Dim Feld As Point2 = GetBestesNahkampfOpfer(Einheiten(MomentaneEinheit), WSS)
                            If Feld.Point1.X >= 0 And Feld.Point2.X >= 0 Then
                                Einheitauswaehlen(Einheiten(MomentaneEinheit), Feld.Point1, KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Feld.Point2.X, Feld.Point2.Y, Schlachtfeld), WSS, 4)
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Nahkampfziehen
    End Sub
    ''' <summary>
    ''' So werden die Einheiten  von einfachen KI's zum Ziel gefuehrt
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub NahkampfZiehen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).IsUsingUnit(MinimalerTreibstoff, MinimaleMunition, MinimaleKP) = True Then
                    If Einheiten(MomentaneEinheit).MinimaleReichweite = 1 Or Not Einheiten(MomentaneEinheit).Waffe1 = "Keine" Then
                        If Einheiten(MomentaneEinheit).KannBesetzen = False Then
                            'So das ist vieleicht eine Nahkampfeinheit und zwar kein Infaterist
                            'und diese Einheit kann nicht Angreifen oder doch nah ja das ist ja eine doofe KI
                            'Also keine Abfrage!
                            Dim WSS As New Wegsuchsystem(Einheiten(MomentaneEinheit), Einheiten(MomentaneEinheit).X, Einheiten(MomentaneEinheit).Y, Einheiten(MomentaneEinheit).GetMap, -1)
                            Dim Ziel As Point = GetNaehestenNahkampfFeind(Einheiten(MomentaneEinheit), WSS)
                            If Ziel.X >= 0 Then
                                Einheitauswaehlen(Einheiten(MomentaneEinheit), Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                            Else
                                Ziel = ZumNaehestenHQZiehen(Einheiten(MomentaneEinheit), WSS)
                                If Ziel.X > 0 Then
                                    Einheitauswaehlen(Einheiten(MomentaneEinheit), Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                                End If
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Infanterieziehen
    End Sub
    ''' <summary>
    ''' So ziehen die Infanteristen
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub InfanterieZiehen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).IsUsingUnit(MinimalerTreibstoff, MinimaleMunition, MinimaleKP) = True Then
                    If Einheiten(MomentaneEinheit).KannBesetzen Then
                        If Not Einheiten(MomentaneEinheit).Waffe1 = "Keine" Or Einheiten(MomentaneEinheit).MinimaleReichweite = 1 Then
                            Dim WSS As Wegsuchsystem = Nothing
                            Dim Ziel As Point2 = GetBestesNahkampfOpfer(Einheiten(MomentaneEinheit), WSS)
                            If Ziel.Point1.X >= 0 And Ziel.Point2.X >= 0 Then
                                Einheitauswaehlen(Einheiten(MomentaneEinheit), Ziel.Point1, KIModiExtern.Angriff, Objektverwalter.Spielfeld.Einheiten(Ziel.Point2.X, Ziel.Point2.Y, Schlachtfeld), WSS, 4)
                            Else
                                'wir schauen ob wir zu einer Besetzung gehen

                                If InfantrieMoveToTransporterOrBesetzung(Einheiten(MomentaneEinheit)) Then
                                    Exit Sub
                                Else
                                    WSS = New Wegsuchsystem(Einheiten(MomentaneEinheit), , True)
                                    'Wir gehen zu einem Feind.
                                    Dim Zielpunkt As Point = GetNaehestenNahkampfFeind(Einheiten(MomentaneEinheit), WSS)
                                    If Zielpunkt.X >= 0 Then
                                        Einheitauswaehlen(Einheiten(MomentaneEinheit), Zielpunkt, KIModiExtern.Warten, Nothing, WSS)
                                    Else
                                        Dim Z As Point = ZumNaehestenHQZiehen(Einheiten(MomentaneEinheit), WSS)
                                        If Z.X > 0 Then
                                            Einheitauswaehlen(Einheiten(MomentaneEinheit), Z, KIModiExtern.Warten, Nothing, WSS, 4)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.Fernkampfziehen
    End Sub
    ''' <summary>
    ''' So werden die Fernkampf Einheiten der Kinderleichten KI gezogen
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Fernkampfziehen()
        While MomentaneEinheit < Einheiten.Length
            If ExistUnit(Einheiten(MomentaneEinheit)) = True Then
                If Einheiten(MomentaneEinheit).IsUsingUnit(MinimalerTreibstoff, MinimaleMunition, MinimaleKP) = True Then
                    If Einheiten(MomentaneEinheit).MaximaleReichweite > 1 Then
                        Dim WSS As New Wegsuchsystem(Einheiten(MomentaneEinheit), Einheiten(MomentaneEinheit).X, Einheiten(MomentaneEinheit).Y, Einheiten(MomentaneEinheit).GetMap, -1)
                        Dim Ziel As Point = GetNaehestesFernkampffeld(Einheiten(MomentaneEinheit), WSS)
                        If Ziel.X >= 0 Then
                            Einheitauswaehlen(Einheiten(MomentaneEinheit), Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                        Else
                            Ziel = ZumNaehestenHQZiehen(Einheiten(MomentaneEinheit), WSS)
                            If Ziel.X > 0 Then
                                Einheitauswaehlen(Einheiten(MomentaneEinheit), Ziel, KIModiExtern.Warten, Nothing, WSS, 4)
                            End If
                        End If
                    End If
                End If
            End If
            MomentaneEinheit += 1
        End While
        KIModusIntern = KIModiIntern.TransporterVerladen
    End Sub

    ''' <summary>
    ''' Laesst die KI Truppen bauen.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Bauen()
        TrimGebaeude()
        Gebaeude = SortGebaeude(Gebaeude, GebaeudeSortierKriterien.Zufall)
        If Spieler.Bauprioritaeten IsNot Nothing Then
            KIGenerellerSuperBau.Bauen(Gebaeude, Spieler.Bauprioritaeten)
        Else
            'Erst mal Zaehlen wir die Zahl von bestimmten Einheiten.
            Infis = CountInfanteristen() 'Wie viele Infis haben wir?
            TTPs = CountAnyUnit("TTP") 'Wie viele TTPs?
            LBoote = CountAnyUnit("L-BOOT") 'Wie viele LandeBoote?
            THelis = CountAnyUnit("T-HELI") 'Wie viele T-Helis?
            Spaeher = CountAnyUnit("SPAEHER") 'Wie viele Spaeher?
            Dim DurchGaenge As Integer = 0
            If Spieler.VeraenderteWerte.KeinBau = False Then
                While MomentaneEinheit < Gebaeude.Length
                    Dim BauGebaeude As ObjektGebaeude = Gebaeude(MomentaneEinheit)
                    If Objektverwalter.Spielfeld.Einheiten(BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y, Schlachtfeld) Is Nothing Then
                        If BauGebaeude.GetBauliste(BauGebaeude.Spieler).Length > 0 Then
                            'auf dem Feld ist keine Einheit und das Gebaeude kann Einheiten bauen
                            If Infis < 5 And CanBuildInfi(BauGebaeude) = True Then
                                'Wir bauen Infanteristen.
                                InfisBauen(BauGebaeude)
                            ElseIf TTPs < 1 And Infis >= 5 And BauGebaeude.CanBuildUnit("TTP") Then
                                'Wir bauen einen TTP
                                GebaeudeAuswaehlen(KIModiExtern.EinheitBauen, BauGebaeude, New EinheitTTP(Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y), 4)
                                TTPs += 1
                            ElseIf THelis < 1 And Infis >= 5 And BauGebaeude.CanBuildUnit("T-HELI") Then
                                'Wir bauen einen T-Heli
                                GebaeudeAuswaehlen(KIModiExtern.EinheitBauen, BauGebaeude, New EinheitTransporthelikopter(Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y), 4)
                                THelis += 1
                            ElseIf Infis >= 5 And LBoote < 2 And BauGebaeude.CanBuildUnit("L-BOOT") Then
                                'Wir baut ein L-Boot
                                GebaeudeAuswaehlen(KIModiExtern.EinheitBauen, BauGebaeude, New EinheitL_Boot(Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y), 4)
                                LBoote += 1
                            ElseIf Infis >= 5 And TTPs >= 1 And Spaeher < 1 And BauGebaeude.CanBuildUnit("SPAEHER") Then
                                GebaeudeAuswaehlen(KIModiExtern.EinheitBauen, BauGebaeude, New EinheitSpaeher(Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y), 4)
                                Spaeher += 1
                            ElseIf Spieler.Fonds > AllesBauSumme And Objektverwalter.Spielfeld.Runde > 1 Then
                                CreatePanzerFlugzeuge(BauGebaeude)
                            ElseIf Infis >= 5 And TTPs >= 1 And THelis >= 1 Then
                                'Wir bauen Panzer und Flugzeuge und Schiffe.
                                CreatePanzerFlugzeuge(BauGebaeude)
                            ElseIf Infis >= 5 And TTPs >= 1 And Spieler.Fonds >= BilligsterPanzer And BauGebaeude.GetBauliste(Spieler.Spieler).Contains("INF") Then
                                'Wir bauen einen Panzer.
                                CreatePanzerFlugzeuge(BauGebaeude)
                            End If
                        End If
                    End If
                    MomentaneEinheit += 1
                    If MomentaneEinheit >= Gebaeude.Length Then
                        'wir sind alle Gebaeude einmal Durchgegangen evtl. gehen wir sie noch mal durch.
                        If Spieler.Fonds > BilligsterPanzer And DurchGaenge < 10 Then
                            MomentaneEinheit = 0
                            DurchGaenge += 1
                        End If
                    End If
                End While
            End If
        End If
        MomentaneEinheit = 0
        If Schlachtfeld = ObjektSpielfeld.Bodenschlacht And Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
            Schlachtwechsel(EinheitenSortierKriterien.Zufall)
            KIModusIntern = KIModiIntern.StartWarten
        Else
            'Wir beenden.
            KIModusIntern = KIModiIntern.RundenEnde
        End If
    End Sub
    ''' <summary>
    ''' Baut einen Infi Mech oder Scharfschuetzen irgendetwas, das besetzen kann.;)
    ''' </summary>
    ''' <param name="BauGebaeude"></param>
    ''' <remarks></remarks>
    Private Sub InfisBauen(ByVal BauGebaeude As ObjektGebaeude)
        Dim Infis As String() = GetBuildInfis(BauGebaeude)
        If CanMoveAfterBuilding(New EinheitInfanterie(0, 0, 0), BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y) = True Then
            If Zufallszahl(1, 100) < 70 Then
                Dim BilligsteTruppe As ObjektEinheit = Nothing
                For I2 = 0 To Infis.Length - 1
                    Dim E As ObjektEinheit = ObjektLadeklasse.NewEinheit(Infis(I2), Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y)
                    If BilligsteTruppe Is Nothing Then
                        BilligsteTruppe = E
                    ElseIf E.Kosten < BilligsteTruppe.Kosten Then
                        BilligsteTruppe = E
                    ElseIf E.Kosten = BilligsteTruppe.Kosten And Zufallszahl(0, 2) = 0 Then
                        BilligsteTruppe = E
                    End If
                Next
                'Dann mal los ihr Infis
                GebaeudeAuswaehlen(KIModiExtern.EinheitBauen, BauGebaeude, BilligsteTruppe)
                Me.Infis += 1
            Else
                If Spieler.Fonds > 4000 And Objektverwalter.Spielfeld.Runde > 1 Then
                    GebaeudeAuswaehlen(KIModiExtern.EinheitBauen, BauGebaeude, ObjektLadeklasse.NewEinheit(Infis(Zufallszahl(0, Infis.Length - 1)), Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y))
                    Me.Infis += 1
                ElseIf Spieler.Fonds > 10000 And Objektverwalter.Spielfeld.Runde = 1 Then
                    GebaeudeAuswaehlen(KIModiExtern.EinheitBauen, BauGebaeude, ObjektLadeklasse.NewEinheit(Infis(Zufallszahl(0, Infis.Length - 1)), Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y))
                    Me.Infis += 1
                Else
                    For I = 0 To Infis.Length - 1
                        If Infis(I) = "INF" Then
                            GebaeudeAuswaehlen(KIModiExtern.EinheitBauen, BauGebaeude, New EinheitInfanterie(Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y))
                            Me.Infis += 1
                            Exit For
                        End If
                    Next
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' Laesst diese KI nach einem gewissen System einen Panzer bzw. Flugzeug bauen.
    ''' </summary>
    ''' <param name="BauGebaeude"></param>
    ''' <remarks></remarks>
    Private Sub CreatePanzerFlugzeuge(ByVal BauGebaeude As ObjektGebaeude)
        Dim Bauliste() As ObjektEinheit = {}
        If Spieler.Fonds > AllesBauSumme Then
            For Each Einheit In BauGebaeude.GetBauliste(BauGebaeude.Spieler)
                If BauGebaeude.CanBuildUnit(Einheit) Then
                    Dim E As ObjektEinheit = ObjektLadeklasse.NewEinheit(Einheit, Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y, )
                    If CanMoveAfterBuilding(E, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y) Then
                        If Objektverwalter.HatEinheitWaffen(Einheit) = True Then
                            Dim Kosten As Integer = ObjektLadeklasse.GetEinheitenkosten(Einheit)
                            If Kosten >= BilligsterPanzer Then
                                Array.Resize(Bauliste, Bauliste.Length + 1)
                                Bauliste(Bauliste.Length - 1) = E
                            ElseIf Einheiten.Length > 20 Then
                                'wenn wir viele Truppen haben bauen wir alles.
                                Array.Resize(Bauliste, Bauliste.Length + 1)
                                Bauliste(Bauliste.Length - 1) = E
                            End If
                        ElseIf Einheit = MovementSorts.HOELLIUM.tostring.toupper And Einheiten.Length > 15 And Zufallszahl(0, 20) = 0 Then
                            Array.Resize(Bauliste, Bauliste.Length + 1)
                            Bauliste(Bauliste.Length - 1) = E
                        End If
                    End If
                End If
            Next
        Else
            For Each Einheit In BauGebaeude.GetBauliste(BauGebaeude.Spieler)
                If BauGebaeude.CanBuildUnit(Einheit) Then
                    If Objektverwalter.HatEinheitWaffen(Einheit) = True Then
                        Dim E As ObjektEinheit = ObjektLadeklasse.NewEinheit(Einheit, Spieler.Spieler, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y, )
                        If CanMoveAfterBuilding(E, BauGebaeude.Rechteck.X, BauGebaeude.Rechteck.Y) Then
                            Dim Kosten As Integer = ObjektLadeklasse.GetEinheitenkosten(Einheit)
                            If Kosten >= BilligsterPanzer And Kosten <= TeuersterPanzer Then
                                Array.Resize(Bauliste, Bauliste.Length + 1)
                                Bauliste(Bauliste.Length - 1) = E
                            End If
                        End If
                    End If
                End If
            Next
        End If
        If Bauliste.Length > 0 Then
            GebaeudeAuswaehlen(KIModiExtern.EinheitBauen, BauGebaeude, Bauliste(Zufallszahl(0, Bauliste.Length - 1)), 4)
        End If
    End Sub
    ''' <summary>
    ''' Mit dieser Funktion beenden die einfachen KI's die Runde
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub RundenEnde()
        If Spieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
            Dim GabefuellstandKO1 As Integer = Spieler.KOS(0).Gabeleiste
            Dim GabefuellstandKO2 As Integer = -1
            If IsNothing(Spieler.KOS(1)) = False Then
                GabefuellstandKO2 = Spieler.KOS(1).Gabeleiste
            End If
            If GabefuellstandKO2 >= 0 Then
                If Objektverwalter.Spielfeld.Regeln.DoppelGabe Then
                    Dim MaximaleSternDifferenz As Integer = ((Spieler.KOS(0).SpezialgabeKosten + Spieler.KOS(0).Gabekosten) * Spieler.KOS(0).Sternkosten - GabefuellstandKO1) - ((Spieler.KOS(1).SpezialgabeKosten + Spieler.KOS(1).Gabekosten) * Spieler.KOS(1).Sternkosten - GabefuellstandKO2)
                    If MaximaleSternDifferenz < -1000 Then
                        RundenEndeMitWechsel = True
                        Spieler.Wechsel()
                    End If
                Else
                    Dim Dif1 As Integer = ((Spieler.KOS(0).SpezialgabeKosten + Spieler.KOS(0).Gabekosten) * Spieler.KOS(0).Sternkosten - GabefuellstandKO1)
                    Dim Dif2 As Integer = ((Spieler.KOS(1).SpezialgabeKosten + Spieler.KOS(1).Gabekosten) * Spieler.KOS(1).Sternkosten - GabefuellstandKO2)
                    If Dif1 > Dif2 Then
                        RundenEndeMitWechsel = True
                        Spieler.Wechsel()
                    End If
                End If

            End If
        ElseIf Spieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
            If Spieler.KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                RundenEndeMitWechsel = True
                Spieler.Wechsel()
            End If
        End If
        Schleife = True
    End Sub

    Protected Overrides Function CalculateRealZiel(ByRef WSS As Wegsuchsystem, ByVal Ziel As System.Drawing.Point, ByVal Einheit As ObjektEinheit, ByRef Opfer As System.Drawing.Point) As System.Drawing.Point
        Return Ziel
    End Function
End Class
